// 测试链接：https://www.luogu.com.cn/problem/P1083
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率较高的写法
// 提交以下的所有代码，可以直接通过

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e6 + 10;
int n, m;
int rest[MAXN];
int d[MAXN], s[MAXN], t[MAXN];
long long num[MAXN]; // 每天教室需求数

inline int read()
{
    char ch = getchar();
    int x = 0, f = 1;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = 10 * x + ch - '0';
        ch = getchar();
    }
    return f * x;
}

// 看看是否能够满足前x个订单，如果可以，返回true
// 否则，返回false
bool check(int x)
{
    memset(num, 0, sizeof num);
    // 枚举订单数
    for(int i = 1; i <= x; ++i)
    {
        // 差分
        num[s[i]] += d[i];
        num[t[i] + 1] -= d[i];
    }

    // 枚举天数
    for(int i = 1; i <= n; ++i)
    {
        // 前缀和
        num[i] += num[i - 1];
        if(num[i] > rest[i]) return false;
    }
    return true; // 订单数x，越容易返回true
}

// 返回最多能满足前几个订单
int compute()
{
    int l = 0, r = m, mid;
    int ans = 0;
    while(l <= r)
    {
        mid = l + ((r - l) >> 1);
        if(check(mid)) 
        {
            ans = mid;
            l = mid + 1;
        }
        else r = mid - 1;
    }
    // 前ans个订单都可以满足，而到了第ans+1个订单就无法满足了
    return ans;
}

int main()
{
    n = read(), m = read();
    for(int i = 1; i <= n; ++i) rest[i] = read();
    for(int i = 1; i <= m; ++i)
    {
        d[i] = read(), s[i] = read(), t[i] = read();
    }

    if(check(m)) puts("0");
    else printf("-1\n%d\n", compute() + 1);

    return 0;
}